package com.library.repository;

import com.library.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Optional;

/**
 * 用户数据访问层接口
 * 继承JpaRepository，提供基础的CRUD操作
 * Spring Data JPA会根据方法名自动生成查询实现
 */
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    /**
     * 根据用户名查找用户
     * 用于登录时验证用户名
     * Spring Data JPA会根据方法名自动生成查询：SELECT * FROM users WHERE username = ?
     * 
     * @param username 用户名
     * @return Optional包装的User对象，如果不存在则返回empty
     */
    Optional<User> findByUsername(String username);
    
    /**
     * 检查用户名是否存在
     * 用于注册时检查用户名是否已被使用
     * Spring Data JPA会根据方法名自动生成查询：SELECT COUNT(*) > 0 FROM users WHERE username = ?
     * 
     * @param username 用户名
     * @return true表示用户名已存在，false表示不存在
     */
    boolean existsByUsername(String username);

    /**
     * 搜索用户
     * 支持按关键词、角色、状态进行搜索
     * 
     * @param keyword 搜索关键词，会在username、email、phone中搜索
     * @param role 用户角色
     * @param status 用户状态
     * @return 符合条件的用户列表
     */
    @Query("SELECT u FROM User u WHERE " +
           "(:keyword IS NULL OR :keyword = '' OR " +
           "u.username LIKE CONCAT('%', :keyword, '%') OR " +
           "u.email LIKE CONCAT('%', :keyword, '%') OR " +
           "u.phone LIKE CONCAT('%', :keyword, '%')) AND " +
           "(:role IS NULL OR :role = '' OR u.role = :role) AND " +
           "(:status IS NULL OR :status = '' OR u.status = :status) " +
           "ORDER BY u.createdAt DESC")
    List<User> searchUsers(@Param("keyword") String keyword,
                          @Param("role") String role,
                          @Param("status") String status);

    /**
     * 根据角色查找用户列表
     */
    List<User> findByRole(String role);

    /**
     * 根据状态查找用户列表
     */
    List<User> findByStatus(String status);
}
